package com.nageoffer.shortlink.project.idempotent;

import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * 消息队列幂等处理器
 */
@Component
@RequiredArgsConstructor
public class MessageQueueIdempotentHandler {

    private final StringRedisTemplate stringRedisTemplate;

    private final String IDEMPOTENT_KEY_PREFIX = "short-link:idempotent:";

    /**
     * 判断当前消息是否被消费过
     *
     * @param messageId 消息的唯一标识
     * @return 消息是否被消费过 -- 是否能加上这个标志（能加上标识没有被消费）
     */
    public Boolean isMessageProccessed(String messageId) {
        String key = IDEMPOTENT_KEY_PREFIX + messageId;
        // 成功设置返回true，否则什么都不做返回false
        return (Boolean.TRUE.equals(stringRedisTemplate.opsForValue().setIfAbsent(key, "0", 2, TimeUnit.MINUTES)));
    }

    /**
     * 消息是否成功完成消费
     *
     * @param messageId 消息标识
     * @return 消息成功消费
     */
    public Boolean isAccomplish(String messageId) {
        String key = IDEMPOTENT_KEY_PREFIX + messageId;
        return Objects.equals("1", stringRedisTemplate.opsForValue().get(key));
    }

    /**
     * 设置消息成功消费
     *
     * @param messageId 消息标识
     */
    public void setAccomplish(String messageId) {
        String key = IDEMPOTENT_KEY_PREFIX + messageId;
        stringRedisTemplate.opsForValue().set(key, "1", 2, TimeUnit.MINUTES);
    }

    /**
     * 如果消息处理遇到异常情况，删除幂等标识
     *
     * @param messageId 消息唯一标识
     */
    public void deleteMessage(String messageId) {
        String key = IDEMPOTENT_KEY_PREFIX + messageId;
        stringRedisTemplate.delete(key);
    }
}
